from pickle import FALSE

from django.shortcuts import render
from rest_framework import viewsets,status
from rest_framework.decorators import action
from rest_framework.response import Response

from .models import Classes,Student
from .serializers import StudentSerializer,ClassesSerializer


# Create your views here.
#get 查询集使用list方法，get/pk/单个信息使用retrieve
#post 添加信息使用create  json的格式要用{"key":"value"}-字符串形式传输数据会自动在数据加''
#put 修改信息使用update
#delete/pk/ 指定id删除 使用destroy
#学生的视图类
# class StudentViewSet(viewsets.ViewSet):
#     #查看所有学生
#     def list(self , request):
#         #从模型对象得到学生数据  所有学生 查询集[(模型对象),()]
#         #students = Student.objects.all()————显示出所有数据
#         students = Student.objects.filter(is_delete=False)#过滤filter显示出delete为False的数据
#         #通过序列化器，把查询集转换成json格式
#         #序列化对象  转换json格式的查询集  many=True 转换多条数据为json格式
#         serializer = StudentSerializer(students,many=True)
#         #响应出来 data保存了序列化转换成json后的数据
#         return Response(serializer.data)
#
#     def create(self , request):
#         #添加学生信息
#         #学生信息从客户端传入 json数据
#         # 反序列化转为pyhton格式
#         # 父类Serializer里面的instance判断是否为None ，instance为空时create创建，不为空update添加
#         serializer = StudentSerializer(data=request.data)
#         #校验数据——报错异常raise_exception=True
#         serializer.is_valid(raise_exception=True)
#         #校验数据与约束条件一致，save数据存储
#         serializer.save()
#         #展示数据    返回数据  ，  展示数据请求成功状态status=status.HTTP_201_CREATED
#         return Response(serializer.data, status=status.HTTP_201_CREATED)
#
#     def retrieve(self , request, pk):
#         try:
#             student = Student.objects.filter(is_delete=False).get(id=pk) #过滤filter逻辑删除的数据，根据id查询学生
#         except Student.DoesNotExist: #如果查询不存在  ↓返回404报错
#             return Response(status=status.HTTP_404_NOT_FOUND)
#         #序列化查询到的student
#         serializer = StudentSerializer(student)
#         #响应返回数据
#         return Response(serializer.data)
#
#     def update(self , request, pk):
#         try:
#             student = Student.objects.filter(is_delete=False).get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=status.HTTP_404_NOT_FOUND)
#         #客户端得到的数据反序列化转为python格式
#         # instance指定数据，不为空时为update修改
#         # serializer里面的instance为空创建不为空修改的方法没有实现的函数，需要在自己的serializer文件里手写
#         serializer = StudentSerializer(instance=student,data=request.data)
#         #数据校验
#         serializer.is_valid(raise_exception=True)
#         #数据保存
#         serializer.save()
#         #响应修改后的序列化数据
#         return Response(serializer.data)
#
#     def destroy(self , request, pk):
#         try:
#             #student实例对象（模型对象） 调用的是drfstudy/models/Student模型里的23行 逻辑删除
#             student = Student.objects.filter(is_delete=False).get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=status.HTTP_404_NOT_FOUND)
#         student.delete()#自定义逻辑删除方法
#         return Response(status=status.HTTP_204_NO_CONTENT)#响应，返回删除成功状态


#Django序列化器自带的功能简写，优化兼容了create和update的功能，在网页打开时根据格式直接添加
class StudentViewSet(viewsets.ModelViewSet):
    #定义查询集 ctrl点击viewsets的GenericViewSet(geneics)的GenericAPIView里面的
    queryset = Student.objects.filter(is_delete=False)
    serializer_class = StudentSerializer #序列化器

#ModelViewSet提供增删改查（单一）方法
class ClassViewSet(viewsets.ModelViewSet):
    #定义需要操作的查询集——对Classes定义增删改查功能.过滤出没有被删除的数据操作
    queryset = Classes.objects.filter(is_delete=False)
    #指定哪一个序列化器，进行序列化及反序列化操作
    serializer_class = ClassesSerializer

    #action 定义额外的路由和请求方式
    #  detail为True 携带ID  额外方法查看第一个班级的信息
    #       不带id         filter请求方式"get"   127.0.0.1：8000/drfstudy/classes/firsts
    @action(detail=False, methods=['get'])
    def firsts(self,request):
        #得到班级的信息    班级  objects操作.过滤（逻辑删除信息）.获取第一个信息
        #firsts_class = Classes.objects.filter(is_delete=False).first()
        #get_serializer/get_queryset 都是调用父类viewssets220行里generics34/35行的方法
        firsts_class = self.get_queryset().first()
        #序列化返回
        #serializer =  ClassesSerializer(firsts_class)
        serializer = self.get_serializer(firsts_class)
        return Response(serializer.data) #响应出 存储json格式数据的data

    #带有pk的——http://127.0.0.1:8000/drfstudy/classes/3/find_classesid/
    @action(detail=True, methods=['get'])
    #查看指定班级最后一个学生信息
    def find_classesid(self,request,pk):
        try:  #班级 =  班级表.ob操作.过滤掉（逻辑删除的信息）.获取id
            classes = Classes.objects.filter(is_delete=False).get(id=pk)
        except Classes.DoesNotExist:  #如果不存在 返回报错↓
            return Response(status=status.HTTP_404_NOT_FOUND)
        #得到班级最后一个学生的信息
        student = classes.student_set.last()
        serializer = self.get_serializer(student)
        return Response(serializer.data)  # 响应出 存储json格式数据的data